home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / BEERSRC.ZIP / XMS.ASM < prev    next >
Encoding:
Assembly Source File  |  1993-12-27  |  3.9 KB  |  241 lines

  1. ;
  2. ; XMS support library.
  3. ;
  4. ; [c] copyright 1993 by Alpha-Helix
  5. ; written by Dany Schoch
  6. ;
  7.  
  8.     IDEAL
  9.     P286N
  10.     JUMPS
  11.  
  12.     MODEL    compact, c
  13.  
  14. include "xms.ash"
  15.  
  16.     dataseg
  17.  
  18. xmsentry    dd    ?        ; Entry point of xms driver.
  19. xmsparam    dd    ?        ; Length of block.
  20.         dw    ?        ; Source XMS handle.
  21.         dd    ?        ; 32 offset within source.
  22.         dw    ?        ; Destination block.
  23.         dd    ?        ; 32 offset within destination.
  24.  
  25.  
  26.  
  27.     codeseg
  28.  
  29.  
  30. proc    initXMS
  31.  
  32. ; Check if driver available.
  33.     mov    ax, 4300h        ; Get install state.
  34.     int    2fh
  35.     cmp    al, 80h            ; status = installed ?
  36.     jne    @@absent
  37.  
  38.     mov    ax, 4310h        ; Get driver entry point.
  39.     int    2fh
  40.     mov    [word xmsentry+00], bx
  41.     mov    [word xmsentry+02], es
  42.  
  43.     mov    ax, 1            ; return ok.
  44.     jmp    @@exit
  45.  
  46. @@absent:
  47.     mov    ax, 0
  48.  
  49. @@exit:
  50.     ret
  51.  
  52. endp    initXMS
  53.  
  54.  
  55. proc    shutXMS
  56.  
  57.     mov    ax, 1
  58.     ret
  59.  
  60. endp    shutXMS
  61.  
  62.  
  63.  
  64. ; Gets size of the largest free XMS in kB.
  65. proc    getfreeXMS
  66.  
  67.     mov    ah, 08h
  68.     call    [xmsentry]
  69.  
  70.     ret
  71.  
  72. endp    getfreeXMS
  73.  
  74.  
  75.  
  76. ; Tries to allocate size kilobytes of xms memory.
  77. ; On success: handle will be returned. Otherwise: -1.
  78. proc    allocXMS,    size:word
  79.  
  80.     mov    ah, 09h
  81.     mov    dx, [size]
  82.     call    [xmsentry]
  83.  
  84.     or    ax, ax            ; Check for error.
  85.     mov    ax, dx
  86.     jnz    @@exit
  87.     mov    ax, -1
  88.  
  89. @@exit:
  90.     ret
  91.  
  92. endp    allocXMS
  93.  
  94.  
  95. proc    freeXMS,    handle:word
  96.  
  97.     mov    ah, 0ah
  98.     mov    dx, [handle]
  99.     call    [xmsentry]
  100.  
  101.     ret
  102.  
  103. endp    freeXMS
  104.  
  105.  
  106. ; Move a 'size' bytes from conventional to extended memory.
  107. ; src : normal far ptr into conventional memory.
  108. ; dst : handle of destination block.
  109. ; size: number of bytes to move. Must be even.
  110.  
  111. proc    movememtoXMS uses si,    src:far ptr, dst:word, size:dword
  112.  
  113.     les    ax, [size]
  114.     and    ax, 0fffeh              ; Make even.
  115.     mov    [word xmsparam+00h], ax
  116.     mov    [word xmsparam+02h], es
  117.     mov    [word xmsparam+04h], 0    ; No source handle for conv. memory.
  118.     les    ax, [src]
  119.     mov    [word xmsparam+06h], ax
  120.     mov    [word xmsparam+08h], es
  121.     mov    ax, [dst]
  122.     mov    [word xmsparam+0ah], ax
  123.     mov    [word xmsparam+0ch], 0    ; Offset 0 into destination block.
  124.     mov    [word xmsparam+0eh], 0
  125.  
  126.     mov    ah, 0bh
  127.     mov    si, offset xmsparam
  128.     call    [xmsentry]
  129.  
  130.     ret
  131.  
  132. endp    movememtoXMS
  133.  
  134.  
  135. proc    moveXMStomem uses si,    src:word, dst:far ptr, size:dword
  136.  
  137.     les    ax, [size]
  138.     and    ax, 0fffeh              ; Make even.
  139.     mov    [word xmsparam+00h], ax
  140.     mov    [word xmsparam+02h], es
  141.     mov    ax, [src]
  142.     mov    [word xmsparam+04h], ax
  143.     mov    [word xmsparam+06h], 0
  144.     mov    [word xmsparam+08h], 0
  145.     mov    [word xmsparam+0ah], 0    ; No dest handle.
  146.     les    ax, [dst]
  147.     mov    [word xmsparam+0ch], ax
  148.     mov    [word xmsparam+0eh], es
  149.  
  150.     mov    ah, 0bh
  151.     mov    si, offset xmsparam
  152.     call    [xmsentry]
  153.  
  154.     ret
  155.  
  156. endp    moveXMStomem
  157.  
  158.  
  159.  
  160. ; Move any memory at any size from anywhere to anywhere.
  161. ; Except overlapping blocks won't do.
  162. proc    moveXMS uses si,    src:word, saddr:far ptr, \
  163.                 dst:word, daddr:far ptr, size:dword
  164.  
  165.     les    ax, [size]
  166.     and    ax, 0fffeh              ; Make even.
  167.     mov    [word xmsparam+00h], ax
  168.     mov    [word xmsparam+02h], es
  169.     mov    ax, [src]
  170.     mov    [word xmsparam+04h], ax
  171.     les    ax, [saddr]
  172.     mov    [word xmsparam+06h], ax
  173.     mov    [word xmsparam+08h], es
  174.     mov    ax, [dst]
  175.     mov    [word xmsparam+0ah], ax
  176.     les    ax, [daddr]
  177.     mov    [word xmsparam+0ch], ax
  178.     mov    [word xmsparam+0eh], es
  179.  
  180.     mov    ah, 0bh
  181.     mov    si, offset xmsparam
  182.     call    [xmsentry]
  183.  
  184.     ret
  185.  
  186. endp    moveXMS
  187.  
  188.  
  189. ; Locks XMS and returns 32-bit linear address of locked block.
  190. ; 0 if unsuccessful.
  191. proc    lockXMS,    handle:word
  192.  
  193.     mov    ah, 0ch
  194.     mov    dx, [handle]
  195.     call    [xmsentry]
  196.     or    ax, ax            ; Check for error.
  197.     mov    ax, bx
  198.     jnz    @@exit
  199.     xor    ax, ax            ; Null pointer to indicate error.
  200.     xor    dx, dx
  201. @@exit:
  202.     ret
  203.  
  204. endp    lockXMS
  205.  
  206.  
  207. proc    unlockXMS,    handle:word
  208.  
  209.     mov    ah, 0dh
  210.     mov    dx, [handle]
  211.     call    [xmsentry]
  212.  
  213.     ret
  214.  
  215. endp    unlockXMS
  216.  
  217.  
  218.  
  219. ; get size of allocated XMS. -1 on error.
  220. proc    getXMSsize,    handle:word
  221.  
  222.     mov    ah, 0eh
  223.     mov    dx, [handle]
  224.     call    [xmsentry]
  225.  
  226.     or    ax, ax
  227.     mov    ax, dx
  228.     jnz    @@exit
  229.     mov    ax, -1
  230. @@exit:
  231.     ret
  232.  
  233. endp    getXMSsize
  234.  
  235.  
  236.  
  237.     end
  238.  
  239.  
  240.  
  241.